package visu;

import java.util.List;

/**
 * Un VisualisateurAnimé est un Visualisateur ayant la particularité d'être
 * animé. Il consiste donc à redessiner les entités {@link Dessinable} dans le
 * visualisateur toutes les <code>delaiVisuel</code> ms.
 * 
 * @author COLLET Philippe
 * @author gnpt
 */
public class VisualisateurAnime extends Visualisateur implements Runnable {
	private static final long serialVersionUID = 1L;
	// Le thread dans lequel s'exécute le simulateur
	protected Thread threadAnimation = null;
	// Le délai d'attente entre chaque rafraîchissement du visualisateur en ms
	protected int delaiVisuel = 10;

	/**
	 * Accesseur pour récupérer le délai d'attente entre chaque rafraîchissement
	 * du visualisateur en ms.
	 * 
	 * @return le délai d'attente entre rafraîchissement du visualisateur en ms.
	 */
	public int getDelaiVisuel() {
		return this.delaiVisuel;
	}

	/**
	 * Mutateur pour modifier le délai d'attente entre chaque rafraîchissement
	 * du visualisateur en ms.
	 * 
	 * @param delaiVisuel
	 *            le nouveau délai d'attente entre chaque rafraîchissement du
	 *            visualisateur en ms.
	 */
	public void setDelaiVisuel(int delaiVisuel) {
		this.delaiVisuel = delaiVisuel;
	}

	/**
	 * Démarre le visualisateur animé : crée un nouveau thread dans lequel le
	 * visualisateur animé va s'exécuter et le lance.
	 */
	public void demarre() {
		this.threadAnimation = new Thread(this);
		this.threadAnimation.start();
	}

	/**
	 * Arrête le visualisateur animé.
	 */
	public void arrete() {
		this.threadAnimation = null; // ceci sera testé dans le run()
	}

	/**
	 * A chaque tick d'horloge, le thread redessine les entités dessinables.
	 * 
	 * @see #repaint()
	 */
	@Override
	public void run() {
		// Code du thread pour arrêt propre (cf. sun technical tips)
		Thread currentThread = Thread.currentThread();
		while (this.threadAnimation == currentThread) {
			super.repaint();
			try {
				Thread.sleep(this.delaiVisuel);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * Constructeur par défaut.
	 */
	public VisualisateurAnime() {
		super();
	}

	/**
	 * Constructeur.
	 * 
	 * @param delai
	 *            le délai d'attente entre chaque rafraîchissement du
	 *            visualisateur en ms.
	 */
	public VisualisateurAnime(int delai) {
		super();
		setDelaiVisuel(delai);
	}

	/**
	 * Constructeur.
	 * 
	 * @param largeur
	 *            la largeur du visualisateur en pixels.
	 * @param hauteur
	 *            la hauteur du visualisateur en pixels.
	 * @param ld
	 *            la liste des entités dessinables.
	 */
	public VisualisateurAnime(int largeur, int hauteur,
			List<? extends Dessinable> ld) {
		super(largeur, hauteur, ld);
	}

	/**
	 * Constructeur.
	 * 
	 * @param largeur
	 *            la largeur du visualisateur en pixels.
	 * @param hauteur
	 *            la hauteur du visualisateur en pixels.
	 * @param ld
	 *            la liste des entités dessinables.
	 * @param delai
	 *            le délai d'attente entre chaque rafraîchissement du
	 *            visualisateur en ms.
	 */
	public VisualisateurAnime(int largeur, int hauteur,
			List<? extends Dessinable> ld, int delai) {
		super(largeur, hauteur, ld);
		setDelaiVisuel(delai);
	}

	/**
	 * Constructeur.
	 * 
	 * @param largeur
	 *            la largeur du visualisateur en pixels.
	 * @param hauteur
	 *            la hauteur du visualisateur en pixels.
	 */
	public VisualisateurAnime(int largeur, int hauteur) {
		super(largeur, hauteur);
	}

	/**
	 * Constructeur.
	 * 
	 * @param largeur
	 *            la largeur du visualisateur en pixels.
	 * @param hauteur
	 *            la hauteur du visualisateur en pixels.
	 * @param delai
	 *            le délai d'attente entre chaque rafraîchissement du
	 *            visualisateur en ms.
	 */
	public VisualisateurAnime(int largeur, int hauteur, int delai) {
		super(largeur, hauteur);
		setDelaiVisuel(delai);
	}

	/**
	 * @see visu.Visualisateur#setDessinables(java.util.List)
	 */
	@Override
	public void setDessinables(List<? extends Dessinable> dessinables) {
		super.dessinables = dessinables;
	}
}
